﻿using MIAP.DataAccess.Interfaces;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;

namespace MIAP.Negocio
{

    /// <summary>    
    /// Factory para la resolución y obtención de instancias de DAO's.
    /// </summary>
    internal sealed class DataAccessFactory
    {
        #region Campos

        /// <summary>
        /// Instancia única de la clase.
        /// </summary>
        public static readonly DataAccessFactory Instance = new DataAccessFactory();

        /// <summary>
        /// Contenedor de Unity.
        /// </summary>
        private static IUnityContainer container;

        #endregion

        #region Constructores

        /// <summary>        
        /// Constructor Privado. Evita la creacion de una instancia predeterminada de la clase <see cref="DataAccessFactory"/>.
        /// </summary>
        private DataAccessFactory()
        {
            container = new UnityContainer();
            container.LoadConfiguration("repository");
        }

        #endregion      

        #region Metodos

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del DAO de Proyectos.
        /// </summary>
        /// <returns>Una nueva instancia del DAO.</returns>
        public IProyectosDao CreateProyectosDao()
        {
            return container.Resolve<IProyectosDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del DAO de Periodo carga.
        /// </summary>
        /// <returns>Una nueva instancia del DAO.</returns>
        public IPeriodoCargaDao CreatePeriodoCargaDao()
        {
            return container.Resolve<IPeriodoCargaDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del DAO de Periodo informacion.
        /// </summary>
        /// <returns>Una nueva instancia del DAO.</returns>
        public IPeriodoInformacionDao CreatePeriodoInformacionDao()
        {
            return container.Resolve<IPeriodoInformacionDao>();
        }

        /// <summary>
        ///  Resuelve y devuelve una nueva instancia del DAO de archivos.
        /// </summary>
        /// <returns>Una nueva instancia del DAO</returns>
        public IArchivosDao CreateArchivosDao()
        {
            return container.Resolve<IArchivosDao>();
        }

        /// <summary>
        ///  Resuelve y devuelve una nueva instancia del DAO de formato de archivos.
        /// </summary>
        /// <returns>Una nueva instancia del DAO</returns>
        public IFormatoArchivoDao CreateFormatoArchivosDao()
        {
            return container.Resolve<IFormatoArchivoDao>();
        }

        /// <summary>
        ///  Resuelve y devuelve una nueva instancia del DAO de perfiles.
        /// </summary>
        /// <returns>Una nueva instancia del DAO</returns>
        public IPerfilesDao CreatePerfilesDao()
        {
            return container.Resolve<IPerfilesDao>();
        }

        /// <summary>
        ///  Resuelve y devuelve una nueva instancia del DAO de permisos.
        /// </summary>
        /// <returns>Una nueva instancia del DAO</returns>
        public IPermisosDao CreatePermisosDao()
        {
            return container.Resolve<IPermisosDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de usuarios.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IUsuarioDao CreateUsuariosDao()
        {
            return container.Resolve<IUsuarioDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de funcionalidades.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IPerfilUrlDao CreatePerfilUrlDao()
        {
            return container.Resolve<IPerfilUrlDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de configuración.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IConfiguracionDao CreateConfiguracionDao()
        {
            return container.Resolve<IConfiguracionDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de usuarios.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IUsuarioPerfilDao CreateUsuarioPerfilDao()
        {
            return container.Resolve<IUsuarioPerfilDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de Solicitud de recargas.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public ISolicitudRecargaArchivoDao CreateSolicitudRecargasDao()
        {
            return container.Resolve<ISolicitudRecargaArchivoDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de actualización de versiones.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IActualizaVersionDao CreateActualizacionVersionDao()
        {
            return container.Resolve<IActualizaVersionDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de ejecuta proyecto.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IEjecutaProyectoDao CreateEjecutaProyectoDao()
        {
            return container.Resolve<IEjecutaProyectoDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de consulta cargas proyecto.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IConsultaCargasProyectoDao CreateConsultaCargasProyectoDao()
        {
            return container.Resolve<IConsultaCargasProyectoDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de consulta de ejecución de proyectos.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IConsultaEjecucionProyectoDao CreateConsultaEjecucionProyectoDao()
        {
            return container.Resolve<IConsultaEjecucionProyectoDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de consulta cargas ejecucion proyecto.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public IConsultaCargasEjecucionProyectoDao CreateConsultaCargasEjecucionProyectoDao()
        {
            return container.Resolve<IConsultaCargasEjecucionProyectoDao>();
        }

        /// <summary>
        /// Resuelve y devuelve una nueva instancia del Dao de  cargas de archivos.
        /// </summary>
        /// <returns>Una nueva instancia del dao.</returns>
        public ICargasArchivosDao CreateCargasArchivosDao()
        {
            return container.Resolve<ICargasArchivosDao>();
        }

        #endregion
    }
}
